
import java.util.*;

/**
 * Clase para manejar la etapa de Fetch.
 *
 * @author Villalva Bueno Arely Eunice
 * @author Romero Rodríguez Gabriel Eduardo
 */
class Fetch extends Stage {

    private int instructionSize;

    /**
     * Crea un objeto Fetch e inicializa sus campos.
     */
    public Fetch() {
        super();
        PC = -1;  // fija el contador del programa para que en la primera instrucción sea PC = 0.
        instructionSize = 0;
    }

    /**
     * Procesa la actual instruccion.
     * 
     * @see Instruction
     * @see Decode
     */
    public void step(Vector Instructions, Decode myDecode) {
        instructionSize = Instructions.size();

        //si no esta la casilla de decodificaion mover el PC a la siguiente instruccion.

        if (myDecode.isStall == false) {
            if ((PC < Instructions.size()) && (Instructions.size() > 0)) {
                PC++;
            }
            // carga la siguinete instrucción.
            if ((PC >= 0) && (PC < Instructions.size())) {
                myInstruction = (Instruction) Instructions.elementAt(PC);
            } else {
                myInstruction = new Instruction("NOP");
            }
            myInstruction.flush = false;  // instrucción válida
        }

    }

    /**
     * Regresa una cadena con la etapa actual y el resultado de esta.
     */
    public String toString() {
        String temp;

        if (myInstruction.flush == true) {
            temp = "FLUSHED: \n" + myInstruction + "\n";
            return temp;
        }
        if ((PC >= 0) && (PC < instructionSize)) {
            temp = Integer.toString(PC) + ":\n" + myInstruction + "\n";
        } else {
            temp = myInstruction + "\n";
        }
        return temp;
    }
}
